Cap. 5 Trabalho final

Impacto da taxa Selic no índice Bovespa

5.1 Introdução

Após a regulamentação do Anexo IV e da implementação do Plano Real, o mercado acionário brasileiro teve um grande salto no seu desenvolvimento, tanto em termos de volume dos negócios quanto na eficiência alocativa… A grande conquista do Plano Real foi o controle da inflação. Taxas de inflação em níveis aceitáveis foram e estão sendo mantidas sob controle, devido às constantes intervenções governamentais, aumentando ou reduzindo as taxas de juros, tanto as de curto quanto as de longo prazo, controlando a oferta monetária através dos depósitos compulsórios sobre depósitos à vista, bem como controlando a taxa de câmbio, instrumento utilizado pelo BACEN por um longo período. Há, portanto, por parte de todos os agentes, a necessidade de se conhecer como o mercado acionário responde às mudanças dessas variáveis macroeconômicas. (DE SOUZA GRÔPPO, 2005)

Para os participantes do mercado financeiro, há um interesse dada a influência exercida pela política monetária sobre os mercados, conhecer tais estimativas representaria uma relevante informação para a construção de posições e estratégias, tanto de investimento, bem como para a gestão dos riscos implícitos às operações normalmente desenvolvidas em seu dia-a-dia. (GONÇALVES JUNIOR, 2007)

De acordo com o conhecimento convencional, mudanças nas taxas de juros afetariam o custo de capital e as expectativas futuras quanto à lucratividade das empresas, impactando portanto sua geração de dividendos ao acionista, especialmente se considerada a valores presentes; em última análise, isto repercute no valor de mercado atual da empresa, e portanto de suas ações em Bolsa. (GONÇALVES JUNIOR, 2007)

Porém, a atividade econômica também exerce efeito importante sobre a determinação dos preços na Bolsa de Valores, particularmente no Ibovespa. Os preços das ações são positivamente relacionados com a atividade econômica, medida pelo nível de produção industrial. A política monetária possui efeito significativo sobre a produção industrial o que indicaria a existência do segundo canal pelo qual a política monetária afeta os preços das ações.(DOS SANTOS et al., 2006)

5.2 Objetivo

O objetivo é mensurar e analisar as respostas do mercado acionário às decisões do Comitê de Política Monetária do Banco Central do Brasil (COPOM) em relação à taxa básica de juro, verificando o comportamento do índice agregado da Bolsa de Valores de São Paulo (Bovespa).

5.3 Problema

Quantificar ou prever a influência da taxa selic no índice Bovespa demanda modelos de predições dinâmicas.

A modelagem prevê predizer o Indice Bovespa (serie temporal em base diária) em função das covariáveis (taxa Selic anunciada mês a mês).

Pressupõe-se que cortes não previstos na taxa de juros Selic proporcionem uma valorização das ações, já que abriria espaço para expansão da economia, com aumentos dos lucros e dos dividendos distribuídos pelas empresas.

Mercados eficientes antecipam as decisões do COPOM, o que não deveria sensibilizar o índice bovespa, uma vez que que as mudanças já foram incorporadas ao valor das ações, no entando, as surpresas, a diferença da expectativa e da decisão, deveriam causar uma resposta do índice. O estudo define uma medida que procura captar a surpresa gerada nos mercados. As medidas foram baseadas em dados do mercado de futuros DI 1 dia, pela sua similaridade à taxa SELIC. (GONÇALVES JUNIOR, 2007)

5.4 Metodologia

A meta para a taxa básica de juro, inicialmente referida como TBC, teve sua sistemática alterada em agosto de 1998, quando o Banco Central passou a fazer uso também da TBAN (taxa de assistência para redesconto bancário), ofertando e tomando recursos na banda assim definida, conforme necessidades, importância, garantia e riscos dos agentes envolvidos, aplicando-se também um sistema de quotas instituído na ocasião. Em 05/03/1999, a TBC foi extinta, tendo sido substituída pela SELIC para fins de política monetária, passando-se a empregar esta última como a taxa básica de juro e principal instrumento das operações de mercado aberto. (GONÇALVES JUNIOR, 2007)

O índice Bovespa (ou simplesmente Ibovespa) foi criado há mais de cinquenta anos, em 2 de janeiro de 1968. Antes do Ibovespa, os preços das ações negociadas na Bolsa de Valores de São Paulo (SPSE) eram divulgados por meio de boletim diário (Boletim Diário de Informação – BDI). (CASTRO et al., 2019)

De modo geral, os mercados financeiros são forward looking, o que equivale a dizer que eles estão constantemente incorporando novas informações a seus preços, seja devido a fatos que impactam imediatamente suas operações, seja por razões que modificam expectativas sobre o futuro; é a constatação de que estes agentes são racionais, utilizando toda a informação disponível para realizar suas previsões, tomando valores passados e correntes de variáveis exógenas ou não (LUCAS et al., 1996).

Cada decisão tomada pelo COPOM é estudada por esses agentes, que antecipam em alguma medida seus resultados; assim sendo, quaisquer mudanças observadas nas variáveis correntes e futuras através do tempo decorrerão exclusivamente de mudanças não antecipadas. (CASTRO et al., 2019)

Conseqüentemente, analisar-se a relação direta entre as variações na meta da taxa de juro e as do Índice Bovespa pode mostrar baixa significância entre as variáveis; de fato, se os mercados inevitavelmente não gerarão respostas a mudanças já esperadas, então é preciso distinguir na variação da meta suas componentes antecipada e não antecipada. É o que proporemos a seguir. (CASTRO et al., 2019)

Após apresentação da evolução do índice ibovespa, taxa selic foi calculado o efeito da decisão do COPOM no índice bovespa num período de dez dias antes de depois da decisão e qual foi o retorno para o período.

Em seguida, foi calculado o coeficiente de correlação linear de Pearson entre o índice bovespa e a taxa selic para toda a série e para quatro períodos distintos:

  • de 2004 a 2007: período de início da redução de juros até a crise dos Subprime,
  • de 2008 a 2010: do auge da crise financeira mundial no Brasil até a fase de recuperação do mercado;
  • de 2011 a 2012: período que inclui tendência de redução da taxa básica de juros e a crise financeira, iniciada na Europa em 2011.
  • de 2013 a 2016: período da crise econômica de 2014, conhecida como a “grande recessão brasileira”, foi uma profunda e duradoura crise econômica, sendo caracterizada por recessão por dois anos consecutivos (2015 e 2016) e por sua longa e lenta recuperação, a mais lenta da história do país. (WIKIPEDIA, 2022)
  • de 2017 a 2022: período que incluem os efeitos da COVID-19, iniciada em 2020.

Os dados utilizados neste trabalho foram obtidos de banco de dados, índices e relatórios contidos em sites como da BM&F BOVESPA, BACEN e CVM, além de informações coletadas da literatura indicada.

A análise de correlação será feita utilizando o coeficiente de Pearson que varia de -1 a 1, sendo que o sinal indica a direção, positiva ou negativa, da relação e o valor sugere a força do relacionamento entre as variáveis.

A condução do trabalhe segue os seguintes passos:

Figura 1: Roteiro roteiro Fonte: (YOSHIDA, 2022)

5.4.1 Estimando a Surpresa dos Mercados

Para estimar a surpresa dos mercados, foi utilizado o conjunto de dados da pesquisa Focus que diariamente registra a expectativa do mercado em relação a alguns indicadores macroeconomicos, entre eles a Selic.

Foi considerado que:

Sendo:

  • \(S_t\): surpresa na reunião
  • \(d_t\): decisão do copom sobre o valor da taxa Selic
  • \(m_t\): valor máximo informado pelos respondentes como expectativa para o valor da taxa Selic

Temos que:

\(s_t = d_t - m_t\)

Sempre que \(s_t\) é negativo, o mercado esperava um valor menor do que o decidido pelo COPOM e vice-versa.

# Limpando as variáveis do ambiente
rm(list = ls())

Pacotes utilizados neste trabalho:

library(quantmod)
library(xts)
library(sidrar)
library(timetk)
library(tidyverse)
library(jsonlite)
library(ggplot2)
library(scales)
library(BatchGetSymbols)
library(dplyr)
library(rb3)
library(pastecs)
library(ggpubr)
library(bizdays)
library(gridExtra)
library(GGally)
library(readxl)
library(ggformula)
#conflicts(detail = TRUE)

5.5 Índice IBOVESPA

Dados obtidos pela biblioteca BatchGetSymbols que utiliza o Yahoo Finance como fonte de dados.

first_date = as.Date('2001-12-19') # data reunião 66 do COPOM
last_date = as.Date('2022-11-25')
eval_period = last_date - first_date

df_bvsp = BatchGetSymbols('^BVSP', first.date = first_date,
 last.date = last_date)

O período de análise será de 20 anos, de 2001-12-19 até 2022-11-25.

O comportamento do índice bovespa neste período foi:

bov_plot <- ggplot(df_bvsp$df.tickers, aes(x = ref.date, y = price.adjusted)) +
 geom_line() +
 scale_y_discrete(limits=c(10000, 20000, 30000, 40000, 50000, 60000,
 70000, 80000, 90000, 100000, 110000, 120000, 130000)) +
 scale_x_date(breaks = date_breaks("1 years"),
 labels = date_format("%Y")) +
 xlab('')+ylab('Pontos') +
 labs(title='Índice Bovespa',
 caption='Fonte: Yahoo Finance.') +
 geom_line() +
 geom_smooth(method = "loess", se = FALSE) +
 scale_y_continuous(labels = label_comma()) +
 theme(axis.text.x = element_text(angle = 90)
)

5.6 Indicador SELIC

A meta da taxa SELIC diária. Conjunto de dados obtido pela opção de download do gráfico.

df_selic_meta <- read.csv2(file = "../dados/selic-bcb-2022-12-11.csv",
                           sep=";", dec=",",
                           colClasses = c("character", "numeric"),
                           col.names = c("ref.date", "selic.tax"))
df_selic_meta <- transform(df_selic_meta, ref.date = as.Date(ref.date,'%Y-%m-%d'))

df_selic_meta <- na.omit(df_selic_meta) %>% 
                    filter(ref.date >= first_date)

tail(df_selic_meta)
##        ref.date selic.tax
## 3648 2022-12-06     13.75
## 3649 2022-12-07     13.75
## 3650 2022-12-08     13.75
## 3651 2022-12-09     13.75
## 3652 2022-12-10     13.75
## 3653 2022-12-11     13.75

O nome do arquivo indica a data da última extração.

E o comportamento no período foi:

selic_plot <- ggplot(df_selic_meta, aes(x = ref.date, y = selic.tax)) +
 geom_line() +
 scale_x_date(breaks = date_breaks("1 years"),
 labels = date_format("%Y")) +
 xlab('')+ylab('%') +
 labs(title='Meta taxa selic',
 caption='Fonte: Banco Central do Brasil.') +
 geom_line() +
 geom_smooth(method = "loess", se = FALSE) +
 scale_y_continuous(labels = label_comma()) +
 theme(axis.text.x = element_text(angle = 90))

5.7 Pesquisa Focus

O Relatório Focus resume as estatísticas calculadas considerando as expectativas de mercado coletadas até a sexta-feira anterior à sua divulgação. Ele é divulgado toda segunda-feira. O relatório traz a evolução gráfica e o comportamento semanal das projeções para índices de preços, atividade econômica, câmbio, taxa Selic, entre outros indicadores. As projeções são do mercado, não do Banco Central. BC - Focus.

Esse conjunto de dados é o resultado da pesquisa diária das expectativas para a taxa selic. Os respondentes são cerca de 120 bancos, gestores de recursos e demais instituições (empresas do setor real, distribuidoras, corretoras, consultorias e outras).

As expectativas são expressadas na forma do mínimo e do máximo esperado.

df_selic_focus = rbcb::get_market_expectations("annual", "Selic",start_date = "2002-01-01",  end_date = "2022-12-31")

df_selic_focus <- df_selic_focus %>%
                      dplyr::select(Data, DataReferencia, Minimo, Maximo, numeroRespondentes) %>%
                          filter(format(Data, "%Y") == DataReferencia)

names(df_selic_focus)[1] = "ref.date"
names(df_selic_focus)[2] = "ref.year"
names(df_selic_focus)[3] = "min"
names(df_selic_focus)[4] = "max"
names(df_selic_focus)[5] = "respondents"

tail(df_selic_focus)
## # A tibble: 6 × 5
##   ref.date   ref.year   min   max respondents
##   <date>     <chr>    <dbl> <dbl>       <int>
## 1 2022-11-30 2022      13.8  14           131
## 2 2022-11-30 2022      13.8  13.8          45
## 3 2022-12-01 2022      13.8  14           131
## 4 2022-12-01 2022      13.8  13.8          44
## 5 2022-12-02 2022      13.8  14           131
## 6 2022-12-02 2022      13.8  13.8          82

5.8 Reuniões COPOM

Este conjunto de dados foi preparado pelo autor utilizando a fonte de dados Taxas de juros básicas – Histórico do Banco Central que contém todas as datas das reuniões do COPOM, bem como a meta decidida.

df_reuniao_copom <- read_excel("../dados/reunioes-copom-2022.xlsx")

df_reuniao_copom <- df_reuniao_copom %>%
                         dplyr::select(reuniao_n, extraordinaria, reuniao_data, nota, vigencia_inicio, vigencia_fim, meta_selic_ano)

df_reuniao_copom$reuniao_data = as.Date(df_reuniao_copom$reuniao_data)
df_reuniao_copom$vigencia_inicio = as.Date(df_reuniao_copom$vigencia_inicio)
df_reuniao_copom$vigencia_fim = as.Date(df_reuniao_copom$vigencia_fim)

names(df_reuniao_copom)[1] = "meeting.number"
names(df_reuniao_copom)[2] = "extra"
names(df_reuniao_copom)[3] = "ref.date"
names(df_reuniao_copom)[4] = "note"
names(df_reuniao_copom)[5] = "term.start"
names(df_reuniao_copom)[6] = "term.end"
names(df_reuniao_copom)[7] = "decision.target"

head(df_reuniao_copom)
## # A tibble: 6 × 7
##   meeting.number extra ref.date   note  term.start term.end   decision.target
##            <dbl> <dbl> <date>     <chr> <date>     <date>               <dbl>
## 1              1     0 1996-06-26 <NA>  1996-07-01 1996-07-31            1.9 
## 2              2     0 1996-07-30 <NA>  1996-08-01 1996-08-31            1.9 
## 3              3     0 1996-08-21 <NA>  1996-09-01 1996-09-30            1.88
## 4              4     0 1996-09-23 <NA>  1996-10-01 1996-10-31            1.82
## 5              5     0 1996-10-23 <NA>  1996-11-01 1996-11-30            1.78
## 6              6     0 1996-11-27 <NA>  1996-12-01 1996-12-31            1.74

5.9 Ibovespa e selic

Apresentando gráficamente as duas séries:

grid.arrange(bov_plot, selic_plot, ncol=2)

Elas seguem tendências opostas, indicando uma correlação negativa, o que aparentemente sustenta a hipotese de correlação entre as séries.

5.10 Unindo os conjuntos de dados

Os conjuntos de dados do índice ibovespa será aumentado com os conjuntos de dados da meta selic e com as reuniões do COPOM.

# Usando apenas valor ajustado
df_bvsp_close <- df_bvsp$df.tickers %>%
                  dplyr::select(ref.date, price.adjusted)

df_bvsp_selic <- merge(df_bvsp_close, df_selic_meta, by = 'ref.date', all.x = T)

df_bvsp_selic <- merge(df_bvsp_selic, df_selic_focus, by = 'ref.date', all.x = T)

df_bvsp_selic <- df_bvsp_selic %>% 
                    fill(c(selic.tax, ref.year, `min`, `max`), .direction = "downup")

df_bvsp_selic$diff.meta.max = with(df_bvsp_selic, max - selic.tax)

df_bvsp_selic <- merge(df_bvsp_selic, df_reuniao_copom, by = 'ref.date', all.x = T)

df_bvsp_selic <- df_bvsp_selic %>% 
                    fill(c(decision.target, meeting.number, term.start, term.end), .direction = "downup")

round(stat.desc(df_bvsp_selic))
##              ref.date price.adjusted selic.tax ref.year   min   max respondents
## nbr.val          5578           5578      5578       NA  5578  5578        2409
## nbr.null            0              0         0       NA     0     0           0
## nbr.na              0              0         0       NA     0     0        3169
## min             11675           8371         2       NA     1     2          22
## max             19320         130776        14       NA    22    27         137
## range            7645         122405        12       NA    21    25         115
## sum          87846608      351263219     45310       NA 57505 70250      239976
## median          15796          58406         7       NA    10    13         104
## mean            15749          62973         8       NA    10    13         100
## SE.mean            31            422         0       NA     0     0           0
## CI.mean.0.95       61            827         0       NA     0     0           1
## var           5357435      992505261         8       NA    16    22         437
## std.dev          2315          31504         3       NA     4     5          21
## coef.var            0              1         0       NA     0     0           0
##              diff.meta.max meeting.number extra note term.start term.end
## nbr.val               5578           5578   198   NA       5578     5578
## nbr.null               386              0   197   NA          0        0
## nbr.na                   0              0  5380   NA          0        0
## min                     -2             66     0   NA      11676    11710
## max                     20            250     1   NA      19292    19333
## range                   22            184     1   NA       7616     7623
## sum                  24940         950951     1   NA   87734996 87971230
## median                   3            173     0   NA      15771    15812
## mean                     4            170     0   NA      15729    15771
## SE.mean                  0              1     0   NA         31       31
## CI.mean.0.95             0              1     0   NA         61       61
## var                     21           2813     0   NA    5347621  5366735
## std.dev                  5             53     0   NA       2312     2317
## coef.var                 1              0    14   NA          0        0
##              decision.target
## nbr.val                 5578
## nbr.null                   0
## nbr.na                     0
## min                        2
## max                       26
## range                     24
## sum                    64945
## median                    11
## mean                      12
## SE.mean                    0
## CI.mean.0.95               0
## var                       26
## std.dev                    5
## coef.var                   0
gf_point(price.adjusted ~ selic.tax, color = ~ selic.tax, size = ~ price.adjusted, alpha = 0.50, data = df_bvsp_selic) + scale_y_continuous(labels = label_comma())

O preço ibovespa ajutado explicado pela taxa selic parece seguir a tendência observada nos gráficos anteriores, quanto menor a taxa, maior é o preço ajustado.

df_not_expected <- df_bvsp_selic[order(-df_bvsp_selic$meeting.number), ] %>% 
                     filter(!is.na(meeting.number) & diff.meta.max < 0) %>%
                       select(meeting.number, ref.date, diff.meta.max, price.adjusted) %>%
                          group_by(meeting.number) %>%
                            slice(which.min(ref.date))

df_not_expected
## # A tibble: 14 × 4
## # Groups:   meeting.number [14]
##    meeting.number ref.date   diff.meta.max price.adjusted
##             <dbl> <date>             <dbl>          <dbl>
##  1            202 2016-11-18         -0.25          59962
##  2            203 2017-01-02         -2             59589
##  3            204 2017-01-11         -2             62446
##  4            205 2017-02-22         -2.25          68590
##  5            206 2017-04-12         -2.25          63892
##  6            207 2017-05-31         -1.5           62711
##  7            208 2017-07-26         -1             65011
##  8            209 2017-09-06         -0.5           73412
##  9            210 2017-11-03         -0.25          73915
## 10            211 2017-12-06         -0.5           73268
## 11            224 2019-09-02         -0.5          100626
## 12            225 2019-09-18         -0.5          104532
## 13            230 2020-06-03         -0.25          93002
## 14            231 2020-06-17         -0.5           95547
log.retorno = diff(log(df_bvsp_selic$price.adjusted))
log.retorno[length(log.retorno) + 1] = 0

gf_point(log.retorno ~ diff.meta.max, color = ~ diff.meta.max, alpha = 0.50, data = df_bvsp_selic) + scale_y_continuous(labels = label_comma())

De acordo com o gráfico acima, o log retorno do preço ajustado das ações não parece ser influenciado pela diferença da meta vs o máximo esperado. Pela hipótese de que a surpresa faria o índice bovespa recuar, quanto menor a diferença, menor deveria ser o retorno, o que não foi observado.

temp <- df_bvsp_selic[order(-df_bvsp_selic$meeting.number), ] %>% 
          filter(!is.na(meeting.number)) %>%
            select(ref.date, diff.meta.max)

ggplot(temp, aes(x = ref.date, y = diff.meta.max))+
 geom_line()+
 labs(title='Variação expectativa meta vs focus',
 caption='Fonte: autor.')+
 geom_line() +
 geom_smooth(method = "loess", se = FALSE)+
 theme(axis.text.x = element_text(angle = 90))+
 geom_line(aes(y = 0), color = "red", linetype = "dotted")

Reuniões cuja a meta foi superior ao máximo esparado pelos respondentes da pesquisa focus.

temp %>%
  filter(diff.meta.max < 0)
##       ref.date diff.meta.max
## 1   2020-06-17         -0.50
## 2   2020-06-03         -0.25
## 3   2020-06-04         -0.25
## 4   2020-06-05         -0.25
## 5   2020-06-08         -0.25
## 6   2020-06-09         -0.25
## 7   2020-06-10         -0.25
## 8   2020-06-12         -0.50
## 9   2020-06-15         -0.50
## 10  2020-06-16         -0.50
## 11  2019-09-18         -0.50
## 12  2019-09-02         -0.50
## 13  2019-09-03         -0.50
## 14  2019-09-04         -0.50
## 15  2019-09-05         -0.50
## 16  2019-09-06         -0.50
## 17  2019-09-09         -0.50
## 18  2019-09-10         -0.50
## 19  2019-09-11         -0.50
## 20  2019-09-12         -0.50
## 21  2019-09-13         -0.50
## 22  2019-09-16         -0.50
## 23  2019-09-17         -0.50
## 24  2017-12-06         -0.50
## 25  2017-11-03         -0.25
## 26  2017-11-06         -0.25
## 27  2017-11-07         -0.25
## 28  2017-11-08         -0.25
## 29  2017-11-09         -0.25
## 30  2017-11-10         -0.25
## 31  2017-11-13         -0.25
## 32  2017-11-14         -0.25
## 33  2017-11-16         -0.25
## 34  2017-11-17         -0.25
## 35  2017-11-21         -0.25
## 36  2017-11-22         -0.25
## 37  2017-11-23         -0.50
## 38  2017-11-24         -0.50
## 39  2017-11-27         -0.50
## 40  2017-11-28         -0.50
## 41  2017-11-29         -0.50
## 42  2017-11-30         -0.50
## 43  2017-12-01         -0.50
## 44  2017-12-04         -0.50
## 45  2017-12-05         -0.50
## 46  2017-09-06         -0.50
## 47  2017-07-26         -1.00
## 48  2017-07-31         -0.50
## 49  2017-08-01         -0.50
## 50  2017-08-02         -0.50
## 51  2017-08-03         -0.50
## 52  2017-08-04         -0.50
## 53  2017-08-07         -0.75
## 54  2017-08-08         -0.75
## 55  2017-08-09         -0.75
## 56  2017-08-10         -0.75
## 57  2017-08-11         -0.75
## 58  2017-08-14         -0.75
## 59  2017-08-15         -0.75
## 60  2017-08-16         -0.75
## 61  2017-08-17         -0.75
## 62  2017-08-18         -0.75
## 63  2017-08-21         -0.50
## 64  2017-08-22         -0.50
## 65  2017-08-23         -0.50
## 66  2017-08-24         -0.50
## 67  2017-08-25         -0.50
## 68  2017-08-28         -0.50
## 69  2017-08-29         -0.50
## 70  2017-08-30         -0.50
## 71  2017-08-31         -0.50
## 72  2017-09-01         -0.50
## 73  2017-09-04         -0.50
## 74  2017-09-05         -0.50
## 75  2017-05-31         -1.50
## 76  2017-06-01         -0.50
## 77  2017-06-02         -0.50
## 78  2017-06-05         -0.50
## 79  2017-06-06         -0.50
## 80  2017-06-07         -0.50
## 81  2017-06-08         -0.50
## 82  2017-06-09         -0.50
## 83  2017-06-12         -0.50
## 84  2017-06-13         -0.50
## 85  2017-06-14         -0.50
## 86  2017-06-16         -0.50
## 87  2017-06-19         -0.50
## 88  2017-06-20         -0.50
## 89  2017-06-21         -0.50
## 90  2017-06-22         -0.50
## 91  2017-06-23         -0.50
## 92  2017-06-26         -0.50
## 93  2017-06-27         -0.50
## 94  2017-06-28         -0.50
## 95  2017-06-29         -0.50
## 96  2017-06-30         -0.50
## 97  2017-07-03         -0.75
## 98  2017-07-04         -0.75
## 99  2017-07-05         -0.75
## 100 2017-07-06         -0.75
## 101 2017-07-07         -0.75
## 102 2017-07-10         -0.75
## 103 2017-07-11         -0.75
## 104 2017-07-12         -0.75
## 105 2017-07-13         -0.75
## 106 2017-07-14         -0.75
## 107 2017-07-17         -0.75
## 108 2017-07-18         -0.75
## 109 2017-07-19         -0.75
## 110 2017-07-20         -0.75
## 111 2017-07-21         -1.00
## 112 2017-07-24         -1.00
## 113 2017-07-25         -1.00
## 114 2017-04-12         -2.25
## 115 2017-04-13         -1.25
## 116 2017-04-17         -1.25
## 117 2017-04-18         -1.25
## 118 2017-04-19         -1.50
## 119 2017-04-20         -1.50
## 120 2017-04-24         -1.50
## 121 2017-04-25         -1.50
## 122 2017-04-26         -1.50
## 123 2017-04-27         -1.50
## 124 2017-04-28         -1.50
## 125 2017-05-02         -1.50
## 126 2017-05-03         -1.50
## 127 2017-05-04         -1.75
## 128 2017-05-05         -1.75
## 129 2017-05-08         -1.75
## 130 2017-05-09         -1.75
## 131 2017-05-10         -1.75
## 132 2017-05-11         -1.75
## 133 2017-05-12         -1.75
## 134 2017-05-15         -1.75
## 135 2017-05-16         -1.75
## 136 2017-05-17         -1.75
## 137 2017-05-23         -0.75
## 138 2017-05-24         -0.75
## 139 2017-05-25         -0.75
## 140 2017-05-26         -1.50
## 141 2017-05-29         -1.50
## 142 2017-05-30         -1.50
## 143 2017-02-22         -2.25
## 144 2017-02-23         -1.50
## 145 2017-02-24         -1.50
## 146 2017-03-01         -1.50
## 147 2017-03-02         -1.50
## 148 2017-03-03         -1.50
## 149 2017-03-06         -1.50
## 150 2017-03-07         -1.50
## 151 2017-03-08         -1.50
## 152 2017-03-09         -1.50
## 153 2017-03-10         -1.50
## 154 2017-03-13         -1.50
## 155 2017-03-14         -1.50
## 156 2017-03-15         -1.50
## 157 2017-03-16         -1.50
## 158 2017-03-17         -1.50
## 159 2017-03-20         -1.50
## 160 2017-03-21         -1.50
## 161 2017-03-22         -1.50
## 162 2017-03-23         -2.00
## 163 2017-03-24         -2.00
## 164 2017-03-27         -2.00
## 165 2017-03-28         -2.00
## 166 2017-03-29         -2.00
## 167 2017-03-30         -2.00
## 168 2017-03-31         -2.00
## 169 2017-04-03         -2.25
## 170 2017-04-04         -2.25
## 171 2017-04-05         -2.25
## 172 2017-04-06         -2.25
## 173 2017-04-07         -2.25
## 174 2017-04-10         -2.25
## 175 2017-04-11         -2.25
## 176 2017-01-11         -2.00
## 177 2017-01-12         -1.50
## 178 2017-01-13         -1.50
## 179 2017-01-16         -2.00
## 180 2017-01-17         -2.00
## 181 2017-01-18         -2.00
## 182 2017-01-19         -2.00
## 183 2017-01-20         -2.00
## 184 2017-01-23         -2.00
## 185 2017-01-24         -2.00
## 186 2017-01-26         -2.00
## 187 2017-01-27         -2.00
## 188 2017-01-30         -2.00
## 189 2017-01-31         -2.00
## 190 2017-02-01         -2.00
## 191 2017-02-02         -2.00
## 192 2017-02-03         -2.00
## 193 2017-02-06         -2.25
## 194 2017-02-07         -2.25
## 195 2017-02-08         -2.25
## 196 2017-02-09         -2.25
## 197 2017-02-10         -2.25
## 198 2017-02-13         -2.41
## 199 2017-02-14         -2.41
## 200 2017-02-15         -2.41
## 201 2017-02-16         -2.41
## 202 2017-02-17         -2.41
## 203 2017-02-20         -2.25
## 204 2017-02-21         -2.25
## 205 2017-01-02         -2.00
## 206 2017-01-03         -2.00
## 207 2017-01-04         -2.00
## 208 2017-01-05         -2.00
## 209 2017-01-06         -2.00
## 210 2017-01-09         -2.00
## 211 2017-01-10         -2.00
## 212 2016-11-18         -0.25
## 213 2016-11-21         -0.25

Retorno sobre o preço ajustado do ibovespa entre as reuniões do copom.

ts_temp <- xts(temp[,-1], order.by=as.Date(temp[,1], "%Y-%m-%d"))
names(ts_temp) <- "price.adjusted"

ret_simples <- diff(log(ts_temp$price.adjusted))

ggplot(ret_simples, aes(x = Index, y = price.adjusted))+
 geom_line()+
 labs(title=glue::glue('Ibovespa na data das reuniões'),
 caption='Fonte: autor.')+
 geom_line() +
 geom_smooth(method = "loess", se = FALSE)+
 theme(axis.text.x = element_text(angle = 90))

Computando o log retorno entre as datas das reuniões do COPOM e o preço ajustado, não há uma tendência explícita, sendo que os ganhos de (log retorno maior que zero) superam as perdas (-). Totalizando um retorno de NA.

5.11 Preço ibovespa ajustado antes e depois da reunião

offset <- 10

Preço Ibovespa ajustado 10 dias antes e depois da reunião do copom.

meeting_eval <- data.frame(matrix(ncol = 4, nrow = 0))
colnames(meeting_eval) <- c('meeting.date', 'period.start', 'period.end', 'return')

for (row in 1:nrow(df_not_expected)) {
  meeting_date = df_not_expected[row, ]$ref.date
  start = meeting_date - offset
  end = meeting_date + offset
  temp <- df_bvsp_selic %>%
            filter(ref.date >= start & ref.date <= end) %>%
              select(ref.date, price.adjusted)
  
  ret_simples <- diff(log(temp$price.adjusted))
  
  # Adiciona as métricas no df
  meeting_eval[nrow(meeting_eval) + 1, ] <- list(meeting_date, start, end, sum(ret_simples))

  print(ggplot(temp, aes(x = ref.date, y = price.adjusted))+
   geom_line()+
   labs(title=glue::glue('Variação preço fechamento -{offset}d, reunião de {meeting_date}, +{offset}d'),
   caption='Fonte: autor.')+
   geom_line() +
   geom_smooth(method = "loess", se = FALSE)+
   theme(axis.text.x = element_text(angle = 90))+
   geom_line(aes(x = meeting_date), color = "red", linetype = "dotted"))
}

meeting_eval$period.start <- as.Date(meeting_eval$period.start) 
meeting_eval$period.end = as.Date(meeting_eval$period.end)
meeting_eval$meeting.date = as.Date(meeting_eval$meeting.date)
meeting_eval
##    meeting.date period.start period.end       return
## 1    2016-11-18   2016-11-08 2016-11-28 -0.020518305
## 2    2017-01-02   2016-12-23 2017-01-12  0.098807862
## 3    2017-01-11   2017-01-01 2017-01-21  0.079519759
## 4    2017-02-22   2017-02-12 2017-03-04 -0.002721416
## 5    2017-04-12   2017-04-02 2017-04-22 -0.022486448
## 6    2017-05-31   2017-05-21 2017-06-10  0.008685599
## 7    2017-07-26   2017-07-16 2017-08-05  0.025525570
## 8    2017-09-06   2017-08-27 2017-09-16  0.064611564
## 9    2017-11-03   2017-10-24 2017-11-13 -0.052086357
## 10   2017-12-06   2017-11-26 2017-12-16 -0.019786964
## 11   2019-09-02   2019-08-23 2019-09-12  0.066388126
## 12   2019-09-18   2019-09-08 2019-09-28  0.018218204
## 13   2020-06-03   2020-05-24 2020-06-13  0.079971765
## 14   2020-06-17   2020-06-07 2020-06-27 -0.039811189
positive_return = meeting_eval %>% filter(return > 0) %>% pull(return) %>% sum
negative_return = meeting_eval %>% filter(return < 0) %>% pull(return) %>% sum
overall_return = sum(meeting_eval$return)

count_positive_return = meeting_eval %>% filter(return > 0) %>% count
count_negative_return = meeting_eval %>% filter(return < 0) %>% count
count_overall_return = count(meeting_eval)

Avaliando o retorno nos períodos 10 dias antes e depois das reuniões, as perdas foram de -0.1574107 e os ganhos 0.4417284, gerando um acumulado de 0.2843178. Embora em cerca de 6 das amostra houve um retorno negativo, isso representa 0.43% das amostras.

5.12 Salvando o conjunto de dados

# antes de proceder com o restante do exercicio, vamos salvar o dataset para
# o usar nos proximos modulos
write_rds(df_bvsp_selic, "../dados/df_bvsp_selic.rds")

5.13 Correlação ibovespa e selic

Comparando o índice ibovespa e a selic, percebemos que há uma relação, inversa, entre as duas séries.

bvsp_norm <- sd(df_bvsp_selic$price.adjusted, na.rm=TRUE)
selic_norm <- sd(df_bvsp_selic$selic.tax, na.rm=TRUE)

df_bvsp_selic$price.adjusted.norm <- log(df_bvsp_selic$price.adjusted)
df_bvsp_selic$selic.tax.norm <- log(df_bvsp_selic$selic.tax)

ggplot(df_bvsp_selic, aes(x=ref.date)) +
  
  geom_line(aes(y=price.adjusted.norm), size=2, color="blue", na.rm=TRUE, alpha=.6) + 
  stat_smooth(size=2, aes(y=price.adjusted.norm), color="green", size=1) +
  geom_line(aes(y=selic.tax.norm), size=2, color="red", na.rm=TRUE, alpha=.6) +
  stat_smooth(size=2, aes(y=selic.tax.norm), color = "green") +

  scale_y_continuous(
    
    # Features of the first axis
    name = "bvsp",
    
    # Add a second axis and specify its features
    sec.axis = sec_axis(~./selic_norm, name="selic")
  ) +

#ggtitle("Ibovespa vs Selic") +

 labs(title = "Ibovespa vs Selic",        
     subtitle = 'Relação entre ativos e indicadores macroeconomicos',
     x = 'Anos',
     fill = '') 

Avaliando a correlação cruzada (CCF - Cross Correlation Function) para toda a série, temos:

# https://www.lobdata.com.br/2020/09/15/how-to-perform-correlation-analysis-in-time-series-data-using-r/
df_bvsp_selic_long <- df_bvsp_selic %>% 
  pivot_longer(cols = c(price.adjusted, selic.tax), names_to = "names", values_to = "value")
df_bvsp_selic_long %>% 
  plot_time_series(.date_var = ref.date,
                   .value = value,
                   .facet_vars = names)

As séries tem comportamento muito próximo no tempo.

# CCF plot
df_bvsp_selic_long %>% 
  plot_acf_diagnostics(.date_var = ref.date,
                       .value = price.adjusted.norm,
                       .ccf_vars = selic.tax.norm,
                       .show_ccf_vars_only = T)

E todas as correlações são negativas.

correlation <- cor(df_bvsp_selic$price.adjusted, df_bvsp_selic$selic.tax, method = c("pearson"))

Indicando que há uma relação inversa e forte, como indicado pelo coeficiente de Pearson de -0.1082102,

Teste correlação

cor.test(df_bvsp_selic$price.adjusted, df_bvsp_selic$selic.tax, method=c("pearson"))
## 
##  Pearson's product-moment correlation
## 
## data:  df_bvsp_selic$price.adjusted and df_bvsp_selic$selic.tax
## t = -8.1281, df = 5576, p-value = 5.328e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.13407325 -0.08219993
## sample estimates:
##        cor 
## -0.1082102

Outra forma de exibir a correlação entre ibovespa e selic. A relação foi calculada tanto para o valor nominal, quanto para seus respectivos logs.

ggcorr(df_bvsp_selic %>% select(price.adjusted, selic.tax, price.adjusted.norm, selic.tax.norm), method = c("pairwise", "pearson"), label = TRUE, label_alpha = TRUE) 

A próxima seção avalia a correlação entre as séries em períodos distintos da história econômica.

5.13.1 Crise dos Subprime

Avaliando para o período de 2004 a 2007: período de início da redução de juros até a crise dos Subprime:

start_date = '2004-01-01'
end_date = '2007-12-31'
df_bvsp_selic_long %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    plot_time_series(.date_var = ref.date,
                     .value = value,
                     .facet_vars = names)
correlation = df_bvsp_selic %>%
                filter(ref.date <= start_date & ref.date <= end_date) %>%
                  with(cor(price.adjusted, selic.tax, method = c("pearson")))
## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation
## [1] NA

Teste correlação

df_bvsp_selic %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    with(cor.test(price.adjusted, selic.tax, method=c("pearson")))
## Warning in cor(x, y): o desvio padrão é zero
## 
##  Pearson's product-moment correlation
## 
## data:  price.adjusted and selic.tax
## t = NA, df = 503, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  NA NA
## sample estimates:
## cor 
##  NA
period_eval[nrow(period_eval) + 1, ] <- list("Crise dos subprime", start_date, end_date, correlation)

5.13.2 Crise financeira mundial

No período de 2008 a 2010 houve o auge da crise financeira mundial no Brasil até a fase de recuperação do mercado.

start_date = '2008-01-01'
end_date = '2010-12-31'
df_bvsp_selic_long %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    plot_time_series(.date_var = ref.date,
                     .value = value,
                     .facet_vars = names)
correlation = df_bvsp_selic %>%
                filter(ref.date <= start_date & ref.date <= end_date) %>%
                  with(cor(price.adjusted, selic.tax, method = c("pearson")))
## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation
## [1] NA

Teste correlação

df_bvsp_selic %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    with(cor.test(price.adjusted, selic.tax, method=c("pearson")))
## Warning in cor(x, y): o desvio padrão é zero
## 
##  Pearson's product-moment correlation
## 
## data:  price.adjusted and selic.tax
## t = NA, df = 1492, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  NA NA
## sample estimates:
## cor 
##  NA
period_eval[nrow(period_eval) + 1, ] <- list("Crise financeira mundial", start_date, end_date, correlation)

5.13.3 Crise financeira Europa

De 2011 a 2012 foi o período que inclui tendência de redução da taxa básica de juros e a crise financeira, iniciada na Europa em 2011.

start_date = '2011-01-01'
end_date = '2012-12-31'
df_bvsp_selic_long %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    plot_time_series(.date_var = ref.date,
                     .value = value,
                     .facet_vars = names)
correlation = df_bvsp_selic %>%
                filter(ref.date <= start_date & ref.date <= end_date) %>%
                  with(cor(price.adjusted, selic.tax, method = c("pearson")))
## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation
## [1] NA

Teste correlação

df_bvsp_selic %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    with(cor.test(price.adjusted, selic.tax, method=c("pearson")))
## Warning in cor(x, y): o desvio padrão é zero
## 
##  Pearson's product-moment correlation
## 
## data:  price.adjusted and selic.tax
## t = NA, df = 2234, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  NA NA
## sample estimates:
## cor 
##  NA
period_eval[nrow(period_eval) + 1, ] <- list("Crise financeira Europa", start_date, end_date, correlation)

5.13.4 Grande recessão brasileira

No período de 2013 a 2016 houve a crise econômica de 2014, conhecida como a “grande recessão brasileira”, foi uma profunda e duradoura crise econômica, sendo caracterizada por recessão por dois anos consecutivos (2015 e 2016) e por sua longa e lenta recuperação, a mais lenta da história do país. (WIKIPEDIA, 2022).

start_date = '2013-01-01'
end_date = '2016-12-31'
df_bvsp_selic_long %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    plot_time_series(.date_var = ref.date,
                     .value = value,
                     .facet_vars = names)
correlation = df_bvsp_selic %>%
                filter(ref.date <= start_date & ref.date <= end_date) %>%
                  with(cor(price.adjusted, selic.tax, method = c("pearson")))
## Warning in cor(price.adjusted, selic.tax, method = c("pearson")): o desvio
## padrão é zero
correlation
## [1] NA

Teste correlação

df_bvsp_selic %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    with(cor.test(price.adjusted, selic.tax, method=c("pearson")))
## Warning in cor(x, y): o desvio padrão é zero
## 
##  Pearson's product-moment correlation
## 
## data:  price.adjusted and selic.tax
## t = NA, df = 2727, p-value = NA
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  NA NA
## sample estimates:
## cor 
##  NA
period_eval[nrow(period_eval) + 1, ] <- list("Grande recessão brasileira", start_date, end_date, correlation)

5.13.5 COVID-19

Mais recente, o período de 2017 a 2022 inclue os efeitos da COVID-19, iniciada em 2020.

start_date = '2017-01-01'
end_date = '2022-12-31'
df_bvsp_selic_long %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    plot_time_series(.date_var = ref.date,
                     .value = value,
                     .facet_vars = names)
correlation = df_bvsp_selic %>%
                filter(ref.date <= start_date & ref.date <= end_date) %>%
                  with(cor(price.adjusted, selic.tax, method = c("pearson")))
correlation
## [1] 0.2006021

Teste correlação

df_bvsp_selic %>%
  filter(ref.date <= start_date & ref.date <= end_date) %>%
    with(cor.test(price.adjusted, selic.tax, method=c("pearson")))
## 
##  Pearson's product-moment correlation
## 
## data:  price.adjusted and selic.tax
## t = 12.486, df = 3718, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1695585 0.2312481
## sample estimates:
##       cor 
## 0.2006021
period_eval[nrow(period_eval) + 1, ] <- list("COVID-19", start_date, end_date, correlation)

5.13.6 Resumo

period_eval
##                  period_name period.start period.end cor-pearson
## 1         Crise dos subprime   2004-01-01 2007-12-31          NA
## 2   Crise financeira mundial   2008-01-01 2010-12-31          NA
## 3    Crise financeira Europa   2011-01-01 2012-12-31          NA
## 4 Grande recessão brasileira   2013-01-01 2016-12-31          NA
## 5                   COVID-19   2017-01-01 2022-12-31   0.2006021

5.14 Conclusão

A hipótese de que Ibovespa é influenciado pela taxa Selic foi testada e há indícios que existe uma forte correlação, como demonstrado no quadro resumo. Ao avaliar toda a série, encontramos coeficientes de correlação superiores a \(0,8\), porém, quando analisamos os retornos do índice próximos as decisões do COPOM, os resultados não indicam uma tendência, sendo que apróximadamente \(50%\) das vezes as decisões consideradas surpresa afetaram negativamente e positivamente e o acumulado dos retornos para esses períodos foi positivo.

É de opinião deste autor, que com base nos dados obtidos, existe uma correlação forte entre a Selic e o Ibovespa, porém, essa relação não necessáriamente é unilateral ou exclusiva, podendo outros indicadores macroeconomicos e fatores sócio-economicos influenciarem ambas as séries e suas relações.

Como trabalho futuro, revisar a forma como a surpresa do mercado é calculada, seguindo o modelo usado por Gonçalves Junior (2007) e incluir outros indicadores macroeconomicos, como utilizados por De Souza Grôppo (2005).

5.15 Referências

CASTRO, F. Henrique et al. Fifty-year History of the Ibovespa. Brazilian Review of Finance, v. 17, n. 3, p. 47-65, 2019.

DE SOUZA GRÔPPO, Gustavo. Co-integração e causalidade entre variáveis de política monetária e Ibovespa. Revista de Economia e Administração, v. 4, n. 2, 2005.

DOS SANTOS, Fernando Siqueira; PRADO, Roberto RA. Causalidade Selic-Ibovespa revisada. Revista de Economia e Administração, v. 5, n. 1, 2006.

GONÇALVES JUNIOR, Walter. Surpresas com relação à política monetária e o mercado de capitais: Evidências do caso brasileiro. 2007. Tese de Doutorado.

LUCAS, Robert E.; SARGENT, Thomas. After Keynesian Macroeconomics. In: Miller, P. J. (org.) The Rational Expectations Revolutions: Readings from the Front Line. [S.1]: Massachussetts Institute of Technology, p.05-30, 1996.

YOSHIDA, Olga Satomi. BIGDATA ANALITYCS: data 22-11-2022. São Paulo: Instituto de Pesquisas Tecnológicas do Estado de São Paulo, 2022. 4 slides, color.

WIKIPEDIA. Lista de crises econômicas no Brasil. Disponível em: https://pt.wikipedia.org/wiki/Lista_de_crises_econ%C3%B4micas_no_Brasil. Acesso em: 03 dez. 2022.

Por que usar transformação logarítmica em dados?

B3 Consultas - Setores

Ibovespa - Carteira do Dia - 08/12/22